package com.guanghua.brick.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * 一些字符串处理的工具类
 * @author leeon
 *
 */
public class StringUtil {
	
	private static Log logger = LogFactory.getLog(StringUtil.class);
	
	
	/**
	 * 将LONg数据转换成String数组
	 * @param l
	 * @return
	 */
	public static String[] longArrayToStringArray(Long[] l) {
		if (l == null || l.length == 0) return null;
		
		String[] s = new String[l.length];
		for (int i = 0; i < l.length ; i ++) {
			s[i] = String.valueOf(l[i]);
		}
		
		return s;
	}
	
	/**
	 * 将String数据转换成Long数组
	 * @param l
	 * @return
	 */
	public static Long[] stringArrayToLongArray(String[] s) {
		if (s == null || s.length == 0) return null;
		
		Long[] l = new Long[s.length];
		for (int i = 0; i < s.length ; i ++) {
			try {
				l[i] = new Long(s[i]);
			} catch (NumberFormatException e) {
				logger.error("string to long error:" + s[i]);
				l[i] = null;
			}
		}
		
		return l;
	}
	
	/**
	 * 将string[] 转换成string,用逗号分割
	 * @param s
	 * @return
	 */
	public static String stringArrayToString(String[] s) {
		if (s == null || s.length == 0) return null;
		
		StringBuffer r = new StringBuffer();
		for (int i = 0; i < s.length ; i ++) {
			r.append(",").append(s[i].replace(",", "&comma;"));
		}
		return r.substring(1);
	}
	
	/**
	 * 将用逗号分割的String转换为String array
	 * @param s
	 * @return
	 */
	public static String[] stringToStringArray(String s) {
		if (s == null) return null;
		
		String[] r = s.split(",");
		for (int i = 0; i < r.length ; i ++) {
			r[i] = r[i].replace("&comma;", ",");
		}
		return r;
	}
	
	/**
	 * 将字符串按格式转成日期
	 * @param value
	 * @param format
	 * @return
	 */
	public static Date stringToDate(String value, String format) {
		if (value == null) return null;
		SimpleDateFormat sdf = new SimpleDateFormat((format==null)?"yyyy-MM-dd":format);
		try {
			return sdf.parse(value);
		} catch (ParseException e) {
			logger.error("string to date error:" + value + ", format is " + format, e);
			return null;
		}
	}
	
	public static Date stringToDate(String value) {
		return stringToDate(value, null);
	}
	
	
	/**
	 * 将日期转换成字符串
	 * @param value
	 * @param format
	 * @return
	 */
	public static String dateToString(Date value, String format) {
		if (value == null) return null;
		SimpleDateFormat sdf = new SimpleDateFormat((format==null)?"yyyy-MM-dd":format);
		return sdf.format(value);
	}
	
	public static String dateToString(Date value) {
		return dateToString(value, null);
	}
	
	/**
	 * 日期字符串格式转换
	 */
	public static String dateStringFormat(String source, String sourceFormat, String targetFormat) {
		return dateToString(stringToDate(source, sourceFormat), targetFormat);
	}
	
	public static String dateStringFormat(String source) {
		return dateStringFormat(source, "yyyy-MM-dd HH:mm:ss.S", "yyyy-MM-dd");
	}
	
	/**
	 * 主要用于多选控件中的比较
	 * @param value
	 * @param data
	 * @return
	 */
	public static boolean valueEquals(String value, String data) {
		if (value == null || data == null) return false;
		
		String[] r = stringToStringArray(data);
		for (int i = 0; i < r.length ; i ++) {
			if (value.equals(r[i])) return true;
		}
		
		return false;
	}
	
	public static String databaseNameToJavaName(String s) {
		char[] c = s.toCharArray();
		StringBuffer sb = new StringBuffer();
		
		for (int i = 0; i < c.length ; i ++ ) {
			switch (c[i]) {
				case '_': sb.append((++i<c.length)?Character.toUpperCase(c[i]):"");break;
				default:	sb.append(Character.toLowerCase(c[i]));
			}
		}
		return sb.toString();
	}
	
	/**
	 * 用于替换某个字符串中符合pattern的section
	 * 替换的具体逻辑，在PatternListener接口实现中定义
	 * @param source
	 * @param pattern
	 * @param lsr
	 * @return
	 */
	public static String replacePattern(String source, String pattern, PatternListener lsr) {
		if (pattern == null || pattern.length() == 0 || lsr == null) return source;
		
		Pattern p = Pattern.compile(pattern);
		Matcher m = p.matcher(source);
		StringBuffer sb = new StringBuffer();
		while (m.find()) {
			String g = m.group();
			String n = lsr.onPatternMatch(g);
			m.appendReplacement(sb, (n!=null)?n:g);
		}
		m.appendTail(sb);
		return sb.toString();
	}
	
	/**
	 * 默认的解析方式
	 * 寻找${},括号中可以是任意字符
	 * @param scripts 脚本
	 * @param svl 接口
	 * @return
	 */
	public static String replacePattern(String scripts, PatternListener lsr) {
		
		//判断参数为空的情况
		if (scripts == null) return null;
		//if (svl == null) return scripts;
		
		//初始化字符数组
		char[] chars = scripts.toCharArray();
		StringBuffer ret = new StringBuffer();
		StringBuffer buf = new StringBuffer();
		
		int sta = 0;
		//0表示在最外层,
		//1表示在一个${}之间,
		//2表示在${}中的一个""之中,
		//3表示在${}中的一个''之中
		
		//{计数器,在${}中遇到一个{ +1 ,遇到一个} -1
		int count = 0;
		
		//开始循环		
		for (int i = 0;i < chars.length; i ++) {
			if (chars[i] == '$') {
				//如果在最外层,并且下一个字符就是{
				if (sta == 0 && i+1 < chars.length && chars[i+1] == '{') {
					//初始化stack
					buf.setLength(0);
					buf.append(chars[i]).append(chars[i+1]);
					//跳过下一个
					i ++;
					//设置sta为1
					sta = 1;
				//否则不是触发${的情况
				} else {
					ret.append(chars[i]);
				}
			} else if (chars[i] == '{') {
				//这里的{前一个字符不是$,如果是,该{已经跳过				
				//在最外层
				if (sta == 0) {
					ret.append(chars[i]);
				//在""或者''之间
				} else if (sta == 2 || sta == 3) {
					buf.append(chars[i]);
				//在一个${}间					
				} else {
					count++;
					buf.append(chars[i]);
				}				
			} else if (chars[i] == '}') {				
				//在最外层
				if (sta == 0) {
					ret.append(chars[i]);
				//在""或者''之间
				} else if (sta == 2 || sta == 3) {
					buf.append(chars[i]);
				//在一个${}间					
				} else {
					count--;
					//当count的计数小于0了,说明一个${}结束了
					if (count < 0) {
						
						//设定状态进入外层
						sta = 0; 
						
						//处理这段${}
						buf.append(chars[i]);
						String var = lsr.onPatternMatch(buf.substring(2, buf.length()-1));
						ret.append((var == null)?buf.toString():var);
												
					//否则继续加入缓存中
					} else
						buf.append(chars[i]);
				}				
			} else if (chars[i] == '"') {
				//在最外层
				if (sta == 0) {
					ret.append(chars[i]);
				//在${}间,开始一个字符串""
				} else if (sta == 1) {
					//设置开始
					sta = 2;					
					buf.append(chars[i]);
				//在""间,这是字符串的结束					
				} else if (sta == 2) {
					//设置结束
					sta = 1;
					buf.append(chars[i]);
				//在''间,不作处理					
				} else if (sta == 3) {
					buf.append(chars[i]);
				}
			} else if (chars[i] == '\'') {
				//在最外层
				if (sta == 0) {
					ret.append(chars[i]);
				//在${}间,开始一个字符串""
				} else if (sta == 1) {
					//设置开始
					sta = 3;					
					buf.append(chars[i]);
				//在''间,这是字符串的结束					
				} else if (sta == 3) {
					//设置结束
					sta = 1;
					buf.append(chars[i]);
				//在""间,不作处理
				} else if (sta == 2) {
					buf.append(chars[i]);
				}
							
			//如果是其余字符,直接加入缓存	
			} else {
				//在最外层,直接加入ret中
				if (sta == 0)
					ret.append(chars[i]);
				//否则放入buf中
				else
					buf.append(chars[i]);
			}
		}
		return ret.toString();
	}
}
